#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>


/*
 * 创建一个函数，这个函数返回是一个结构体的首地址，结构体数据包含host、dbname、dbuser、dbpasswd、dbport
 * 传入一个label名，将label名下的响应数据放入结构体对应的数据段中。
 * 
 *  todo: 处理配置文件里有空行的情况
 */


typedef struct config
{
  char host[64];
  char dbname[64];
  char dbuser[64];
  char dbpasswd[64];
  char dbport[64];
} lconfig;

/* 用于函数返回 */
lconfig  *get_config_data;

/* 返回结构体的函数 */
lconfig *get_config(char *label);



int main (int argc, char * argv[]) 
{
  
  lconfig  *data;
  data = get_config("db-1");
  //printf("data = %p\n",data);
  printf("host = %s\n",data->host);
  printf("dbname = %s\n",data->dbname);
  printf("dbpasswd = %s\n",data->dbpasswd);
  printf("dbuser = %s\n",data->dbuser);
  printf("dbport = %s\n",data->dbport);
  /* 释放已经申请到内存空间 */
  free(data);
  return 0;
}


lconfig *get_config(char *label)
{
  /* 文件句柄 */
  FILE *fd;
  /* key、value对于=的左右值 */
  char key[20];
  char value[64];
  //char **value;
  /* 用于读取文件 */
  char buf[128];
  /* 存储[abc]中的abc,即配置文件中的label */
  char match_label[10];
  /* 用于判断是否已经处理过类似[abc]的行，如果处理过，再读取类似的行的时候，直接跳出 */
  int read_tag = 0;

  printf("label = %s\n",label);

  /* 用于存储配置文件数据 */
  get_config_data = (lconfig *)malloc(sizeof(lconfig));

  if(get_config_data == NULL)
  {
    fprintf(stderr,"Can't malloc memory for get_config_data\n");
    exit(1);
  }


  /* 读取配置文件 */
  if( (fd = fopen("/tmp/monitor_mysql.cfg","r")) == NULL )
  {
    fprintf(stderr,"Can't open file!\n");
    exit(1);
  }


  /* 从配置文件里读取一行 */
  while(fgets(buf,128,fd) != NULL)
  {
    int i = 0;
    int j = 0;
       
    /* 以#开头的行，直接跳过 */
    if(buf[0] == '#')
      continue;

    
    // printf("strlen(buf) = %d\n",(int)strlen(buf));
    if(strlen(buf) < 2)
      continue;
           
    /*  如果碰到[abc]的行，单独处理此行，处理完毕之后，继续读取下一行 */
    if(buf[0] == '[')
    {
      if(read_tag == 1)
        break;
      /* 将[abc]中的[]去掉 */
      for(i = 1,j = 0;i < strlen(buf) - 2;i++,j++)
        match_label[j] = buf[i];
      /* 如果找到匹配的label，将read_tag置为1 */
      if(strcmp(label,match_label) == 0)
        read_tag = 1;

      //printf("match_label = %s\n",match_label);
      continue;
    }

    //printf("strlen(label) = %d\n",strlen(label));
    /* 如果没找到要找的label,直接跳到下个循环 */
    if(read_tag == 0)
      continue;
   
    /*
     * dbuser = test
     * 获取=号左边的值
     *
     */

    /*
     * debug
     */
    //printf("line:%d, buf:%s\n", __LINE__, buf);


    for(i = 0;i < strlen(buf);i++)
    {
      /* 将空格去除 */
      if(buf[i] == ' ')
        continue;
      /* 遇到=,结束key的读取 */
      if(buf[i] == '=')
        break;
      key[i] = buf[i];
    }
    /* 在字符串末尾加上字符结束符 */
    key[i] = '\0';



    /* 读取value信息 */
    for(j = 0,i = i + 1;i < strlen(buf) - 1;i++,j++)
    {
      //printf("%c ",buf[i]);
      if(buf[i] == ' ')
        continue;
      value[j] = buf[i];
    }
    /* 添加结束符 */
    value[j] = '\0';
  
    printf("key = %s\n,value = %s\n",key,value);
  
//if(strcmp(key,"host") == 0)
//{
//  //printf("line :%d, key = %s  -->  value = %s\n",__LINE__,key,value);
//  strncpy(get_config_data->host,value,strlen(value));
//  //get_config_data->host = value;  //error
//}
//

    if(strcmp(key,"host") == 0)
      strncpy(get_config_data->host,value,strlen(value));

    if(strcmp(key,"dbpasswd") == 0)  
      strncpy(get_config_data->dbpasswd,value,strlen(value));
      
    if(strcmp(key,"dbname") == 0)
      strncpy(get_config_data->dbname,value,strlen(value));

    if(strcmp(key,"dbuser") == 0)
      strncpy(get_config_data->dbuser,value,strlen(value));

    if(strcmp(key,"dbport") == 0)
      strncpy(get_config_data->dbport,value,strlen(value));
          
    //printf("In 2 get_config_data->host = %s\n",get_config_data->host);

    memset(key,0,sizeof(key));
    memset(value,0,sizeof(value));
  }

  /* 关闭文件句柄 */
  close(fd);
  //printf("get_config_data = %p\n",get_config_data);
  /* 结构体申请的内存空间，读取完配置之后释放(free) */
  return get_config_data;
}
